#pragma once

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class BieuThuc
{
  public:
	  virtual void themBieuThuc(BieuThuc *bt) = 0;
	  virtual string daoHam() = 0;
	  virtual double tinhGiaTri() = 0;
};

class BTHang:public BieuThuc
{
	double c;
public:
	BTHang(double c)
	{
		this->c = c; 
	}
	void themBieuThuc(BieuThuc *bt)
	{
		// Do nothing
	}
	string daoHam()
	{
		return"";
	}
	double tinhGiaTri()
	{
		return 0;
	}
};

class BTDon:public BieuThuc
{
	double a;
	int n;
public:
	BTDon(double a, int n)
	{
		this->a = a;
		this->n = n;
	}
	void themBieuThuc(BieuThuc *bt)
	{
		// Do nothing
	}
	string daoHam()
	{
		return"";
	}
	double tinhGiaTri()
	{
		return 0;
	}
};

class BTTong:public BieuThuc
{
	vector<BieuThuc*> bt;
public:
	BTTong()
	{
	}
	void themBieuThuc(BieuThuc *bt)
	{
		this->bt.push_back(bt);
	}
	string daoHam()
	{
		return"";
	}
	double tinhGiaTri()
	{
		return 0;
	}
};


class BTTich:public BieuThuc
{
	vector<BieuThuc*> bt;
public:
	BTTich()
	{
	}
	void themBieuThuc(BieuThuc *bt)
	{
		this->bt.push_back(bt);
	}
	string daoHam()
	{
		return"";
	}
	double tinhGiaTri()
	{
		return 0;
	}
};

class BTChia:public BieuThuc
{
	vector<BieuThuc*> bt;
public:
	BTChia()
	{
	}
	void themBieuThuc(BieuThuc *bt)
	{
		this->bt.push_back(bt);
	}
	string daoHam()
	{
		return"";
	}
	double tinhGiaTri()
	{
		return 0;
	}
};

class BTPhuc:public BieuThuc
{
	vector<BieuThuc*> bt;
public:
	BTPhuc()
	{

	}
	void themBieuThuc(BieuThuc *bt)
	{
		this->bt.push_back(bt);
	}
	string daoHam()
	{
		return"";
	}
	double tinhGiaTri()
	{
		return 0;
	}
};